package com.demo.config.apache.ocr.OpenCV;

import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

import static org.opencv.highgui.HighGui.imshow;
import static org.opencv.highgui.HighGui.waitKey;
import static org.opencv.imgcodecs.Imgcodecs.imread;
import static org.opencv.imgproc.Imgproc.*;

public class OpenCVTest {

	// 打开摄像头
	public static void open() {
		// 加载动态库
		System.load(new File("src/main/resources/lib/opencv/opencv_java490.dll").getAbsolutePath());
		// System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		// 打开默认摄像头（索引为0）
		VideoCapture capture = new VideoCapture(0);
		// 检查摄像头是否成功打开
		if (!capture.isOpened()) {
			System.out.println("无法打开摄像头。");
			return;
		}
		// 从摄像头读取并显示每一帧
		Mat frame = new Mat();
		while (capture.read(frame)) {
			// 显示图片 HighGui用户界面相关
			imshow("Camera", frame);
			// 等待3毫秒 也就是每3毫秒从摄像头读取一帧
			int key = waitKey(3);
			// 如果输入q 则释放资源
			if (key == 'q' || key == 'Q') {
				// 销毁所有窗口
				HighGui.destroyAllWindows();
				// 释放 VideoCapture 对象
				capture.release();
				System.exit(0);
				break;
			}

		}
		// 销毁所有窗口
		HighGui.destroyAllWindows();
		// 释放 VideoCapture 对象
		capture.release();
		System.exit(0);
	}

	/**
	 * 测试 灰度化+二值化功能
	 * @param imagePath
	 * @return
	 * @throws IOException
	 */
	public static BufferedImage ertyu222(String imagePath) throws IOException {
		System.load(new File("src/main/resources/lib/opencv/opencv_java490.dll").getAbsolutePath());
		Mat image = imread(imagePath); // 加载图像
		// imshow("原图", image);

		// 高斯滤波器（GaussianFilter）对图像进行平滑处理。
		// GaussianBlur(image, image, new Size(3, 3), 0);

		// 这里可以new一个Mat来接收，也可以直接使用原来的image接收cvtColor(image, image, CV_BGRA2GRAY);
		Mat gray = new Mat();
		// cvtColor(image, gray, CV_BGRA2GRAY);// 灰度化
		cvtColor(image, gray, COLOR_BGR2GRAY);// 灰度化
		// 单独开个小窗口
		// imshow("灰度", gray);

		// medianBlur(gray, gray, 3); //中值滤波

		Mat bin = new Mat();
		// 第三参数thresh，要根据自己的实际情况改变大小调试打印看一下。一般取100-200
		// THRESH_OTSU（自动确定阈值）、THRESH_BINARY（基本的二值化）
		threshold(gray, bin, 170, 200, THRESH_BINARY);// 二值化
		// 单独开个小窗口
		// imshow("二值化", bin);

		// bitwise_not(bin, bin); // 反色，即黑色变白色，白色变黑色
		// Mat corrode = new Mat();
		// Mat expand = new Mat();
		// Mat kelner = getStructuringElement(MORPH_RECT, new Size(3, 3), new Point(-1,
		// -1));
		// erode(bin, corrode, kelner); // 腐蚀
		// dilate(corrode, expand, kelner); // 膨胀
		// bitwise_not(expand, expand); // 反色，既黑色变白色，白色变黑色
		// imshow("膨胀", expand);
		//
		// bitwise_not(bin, bin); // 反色，即黑色变白色，白色变黑色
		//
		// //保存二值化图像
		// String imageFile = IMAGE3_PATH + ".png";
		// imwrite(imageFile, bin);

		// 展示图片
		// waitKey(0);

		return Mat2BufferedImage(image);

	}

	// Mat 转 BufferedImage
	public static BufferedImage Mat2BufferedImage(Mat matrix) throws IOException {
		MatOfByte mob = new MatOfByte();
		Imgcodecs.imencode(".png", matrix, mob);
		return ImageIO.read(new ByteArrayInputStream(mob.toArray()));
	}

}
